gsk: Add GskRenderNodeClass.make_immutable()
authorBenjamin Otte <otte@redhat.com>
Sun, 11 Dec 2016 10:53:17 +0000 (11:53 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:09 +0000 (18:01 +0100)
gsk/gskrendernode.c
gsk/gskrendernodeimpl.c
gsk/gskrendernodeprivate.h

index 2126723833d4e3892c07f39946caee3a96000538..62b0caf1d506d674024805fa22aec10467627ac8 100644 (file)
@@ -841,19 +841,12 @@ gsk_render_node_get_blend_mode (GskRenderNode *node)
 void
 gsk_render_node_make_immutable (GskRenderNode *node)
 {
-  GskRenderNode *child;
-
   if (!node->is_mutable)
     return;
 
-  node->is_mutable = FALSE;
+  node->node_class->make_immutable (node);
 
-  for (child = gsk_render_node_get_first_child (node);
-       child != NULL;
-       child = gsk_render_node_get_next_sibling (child))
-    {
-      gsk_render_node_make_immutable (child);
-    }
+  node->is_mutable = FALSE;
 }
 
 /*< private >
index b3ba4755b650ac7081779d4c8eae4f8293af29e1..288bacf6379e561a5f2001b83bf1a8e446cadf31 100644 (file)
@@ -41,11 +41,17 @@ gsk_texture_node_finalize (GskRenderNode *node)
   gsk_texture_unref (self->texture);
 }
 
+static void
+gsk_texture_node_make_immutable (GskRenderNode *node)
+{
+}
+
 static const GskRenderNodeClass GSK_TEXTURE_NODE_CLASS = {
   GSK_TEXTURE_NODE,
   sizeof (GskTextureNode),
   "GskTextureNode",
-  gsk_texture_node_finalize
+  gsk_texture_node_finalize,
+  gsk_texture_node_make_immutable
 };
 
 GskTexture *
@@ -109,11 +115,17 @@ gsk_cairo_node_finalize (GskRenderNode *node)
     cairo_surface_destroy (self->surface);
 }
 
+static void
+gsk_cairo_node_make_immutable (GskRenderNode *node)
+{
+}
+
 static const GskRenderNodeClass GSK_CAIRO_NODE_CLASS = {
   GSK_CAIRO_NODE,
   sizeof (GskCairoNode),
   "GskCairoNode",
-  gsk_cairo_node_finalize
+  gsk_cairo_node_finalize,
+  gsk_cairo_node_make_immutable
 };
 
 /*< private >
@@ -252,11 +264,25 @@ gsk_container_node_finalize (GskRenderNode *node)
 {
 }
 
+static void
+gsk_container_node_make_immutable (GskRenderNode *node)
+{
+  GskRenderNode *child;
+
+  for (child = gsk_render_node_get_first_child (node);
+       child != NULL;
+       child = gsk_render_node_get_next_sibling (child))
+    {
+      gsk_render_node_make_immutable (child);
+    }
+}
+
 static const GskRenderNodeClass GSK_CONTAINER_NODE_CLASS = {
   GSK_CONTAINER_NODE,
   sizeof (GskRenderNode),
   "GskContainerNode",
-  gsk_container_node_finalize
+  gsk_container_node_finalize,
+  gsk_container_node_make_immutable
 };
 
 /**
index 1d46db8db39a2580c66f5bdeac6d641acb871a6b..5ffb48ea46e8dc4528e163099c220f27eb34d7db 100644 (file)
@@ -62,6 +62,7 @@ struct _GskRenderNodeClass
   gsize struct_size;
   const char *type_name;
   void (* finalize) (GskRenderNode *node);
+  void (* make_immutable) (GskRenderNode *node);
 };
 
 GskRenderNode *gsk_render_node_new (const GskRenderNodeClass *node_class);